#!/bin/bash
# Steel Giants для macOS: запуск лаунчера (Windows) в своей бутылке Wine.
# Лежит в Steel Giants.app/Contents/MacOS/. Wine — рядом в Resources/wine (CrossOver 24.0.7 /
# wine 9.0, 32-битный клиент игры — через новый WoW64). Бутылка и игра — в
# ~/Library/Application Support/Steel Giants (приложение только для чтения: его можно
# заменить новой версией, игра и вход останутся).
set -u

APP="$(cd "$(dirname "$0")/../.." && pwd)"
RES="$APP/Contents/Resources"
DATA="$HOME/Library/Application Support/Steel Giants"
LOGDIR="$HOME/Library/Logs/Steel Giants"
mkdir -p "$DATA" "$LOGDIR"
LOG="$LOGDIR/wine.log"
exec >>"$LOG" 2>&1
echo "=== $(date '+%Y-%m-%d %H:%M:%S') запуск, macOS $(sw_vers -productVersion 2>/dev/null) $(uname -m)"

# Метка «скачано из интернета» на файлах Wine внутри приложения: после «Всё равно открыть»
# снимаем её сами, иначе macOS может спрашивать про каждую программу Wine
xattr -dr com.apple.quarantine "$APP" 2>/dev/null || true

say() {   # окно с сообщением; $2 — кнопки через запятую в кавычках AppleScript
    osascript -e "display dialog \"$1\" with title \"Steel Giants\" buttons {${2:-\"OK\"}} default button 1" 2>/dev/null
}

# Mac на Apple M: Wine — программа для Intel, нужен Rosetta 2
if [ "$(uname -m)" = "arm64" ] && ! /usr/bin/arch -x86_64 /usr/bin/true 2>/dev/null; then
    r=$(say "Для игры нужен Rosetta 2 от Apple (бесплатно, ставится один раз). Установить сейчас?" '"Установить", "Отмена"')
    case "$r" in *Установить*) ;; *) exit 0 ;; esac
    osascript -e 'do shell script "/usr/sbin/softwareupdate --install-rosetta --agree-to-license" with administrator privileges' \
        || { say "Rosetta 2 не установился. Попробуйте ещё раз или напишите нам в поддержку."; exit 1; }
fi

export WINEPREFIX="$DATA/prefix"
export PATH="$RES/wine/bin:$PATH"
# freetype, gnutls (HTTPS лаунчера), SDL2, MoltenVK — рядом с Wine
export DYLD_FALLBACK_LIBRARY_PATH="$RES/wine/lib:/usr/lib"
# русская кодовая страница (1251): иначе в игре «????» вместо текста
export LANG=ru_RU.UTF-8 LC_ALL=ru_RU.UTF-8
# без меню/ярлыков Wine в macOS, без .NET и браузера Wine (не нужны, не качаем)
export WINEDLLOVERRIDES="winemenubuilder.exe=d;mscoree=d;mshtml=d"
export WINEDEBUG="${WINEDEBUG:--all}"
export WINEMSYNC=1   # как в Whisky
# Ускорение x87 на Apple M (mac/x87) включено само. Выключить, если игра с ним ведёт себя
# не так: пустой файл «no-x87» в папке ~/Library/Application Support/Steel Giants
if [ -e "$DATA/no-x87" ]; then
    export SG_X87=0
    echo "ускорение x87 выключено файлом no-x87"
fi

GAME="$WINEPREFIX/drive_c/Games/Steel Giants"

# Бутылка от другого движка Wine (прошлые версии приложения: Wine 11, WhiskyWine 2.5) —
# пересоздаём, скачанную игру сохраняем
ENGINE_ID="cx-24.0.7"
if [ -d "$WINEPREFIX" ] && [ "$(cat "$DATA/engine" 2>/dev/null)" != "$ENGINE_ID" ]; then
    echo "бутылка от другого движка — пересоздаю"
    [ -d "$GAME" ] && mv "$GAME" "$DATA/game.keep"
    rm -rf "$WINEPREFIX"
fi

if [ ! -f "$WINEPREFIX/system.reg" ]; then
    echo "первый запуск: создаю бутылку"
    osascript -e 'display notification "Первый запуск: подготовка займёт около минуты" with title "Steel Giants"' 2>/dev/null
    if ! wine wineboot -i; then
        # подробности для разбора: какие библиотеки грузились и где упало
        echo "--- повтор с журналом загрузки"
        rm -rf "$WINEPREFIX"
        WINEDEBUG="+loaddll,+module,err+all,warn+module" wine wineboot -i 2>&1 | head -400
        say "Не удалось подготовить Wine. Пришлите нам файл wine.log из папки ~/Library/Logs/Steel Giants"
        exit 1
    fi
    # курсор и полноэкранный режим как в Windows, без Retina-удвоения
    wine reg add 'HKCU\Software\Wine\Mac Driver' /v RetinaMode /d n /f
    wine reg add 'HKCU\Software\Wine\Mac Driver' /v CaptureDisplaysForFullscreen /d y /f
    wine reg add 'HKCU\Software\Wine\Mac Driver' /v LeftCommandIsCtrl /d y /f
    wineserver -w
    echo "$ENGINE_ID" > "$DATA/engine"
fi
if [ -d "$DATA/game.keep" ]; then
    mkdir -p "$(dirname "$GAME")" && mv "$DATA/game.keep" "$GAME"
fi

# Лаунчер кладём один раз: дальше он обновляет себя и игру сам
if [ ! -f "$GAME/SGLauncher.exe" ]; then
    mkdir -p "$GAME"
    cp "$RES/launcher/SGLauncher.exe" "$RES/launcher/runner.exe" "$GAME/"
    [ -f "$GAME/Launcher.cfg" ] || cp "$RES/launcher/Launcher.cfg" "$GAME/"
    echo "лаунчер скопирован в $GAME"
fi

cd "$GAME" || exit 1
exec wine "C:\\Games\\Steel Giants\\SGLauncher.exe"
